// request请求处理
import Vue from 'vue'
import axios from 'axios'
import store from '@/store'
import qs from 'qs'
import router from '@/router'
import { isArray } from '@/utils/validate'

let loadingInstance
// 基础url
baseURL='https://localhost:8080'
// 配置后端数据的接收方式
contentType= 'application/json;charset=UTF-8'
// 需要加loading层的请求，防止重复提交
debounce= ['doEdit']
// 登录失效code
invalidCode= 402
// 无权限code
noPermissionCode= 401
// 是否开启登录拦截
loginInterception= true
//最长请求时间
requestTimeout= 5000
//操作正常code，支持String、Array、int多种类型
successCode= [200, 0]
//token名称
tokenName= 'accessToken'


// 处理code异常
const handleCode = (code, msg) => {
  switch (code) {
    case invalidCode:
      Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, 'error')
      break
    case noPermissionCode:
      // 处理无权限异常，重定向到401页面
      router.push({ path: '/401' }).catch(() => {})
      break
    default:
      // 处理其他异常状态码，提示用户
      Vue.prototype.$baseMessage(msg || `后端接口${code}异常`, 'error')
      break
  }
}
// 创建axios实例
const instance = axios.create({
  baseURL,
  timeout: requestTimeout,
  headers: {
    'Content-Type': contentType,
  },
})
// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    //这里会过滤所有为空、0、false的key，如果不需要请自行注释
    if (config.data) config.data = Vue.prototype.$baseLodash.pickBy(config.data, Vue.prototype.$baseLodash.identity)
    // 将请求数据转为x-www-form-urlencoded格式
    if (config.data && config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=UTF-8')
      config.data = qs.stringify(config.data)
    // 对于特定的请求，显示加载动画
    if (debounce.some((item) => config.url.includes(item))) loadingInstance = Vue.prototype.$baseLoading()
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)
// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    if (loadingInstance) loadingInstance.close()
    const { data, config } = response
    const { code, msg } = data
    // 操作正常Code数组
    const codeVerificationArray = isArray(successCode) ? [...successCode] : [...[successCode]]
    // 是否操作正常
    if (codeVerificationArray.includes(code)) {
      return data
    } else {
      // 处理异常状态码
      handleCode(code, msg)
      return Promise.reject(
        `vue-admin-beautiful请求异常拦截:${JSON.stringify({
          url: config.url,
          code,
          msg,
        })}` || 'Error'
      )
    }
  },
  (error) => {
    if (loadingInstance) loadingInstance.close()
    const { response, message } = error
    if (error.response && error.response.data) {
      const { status, data } = response
      // 处理异常状态码
      handleCode(status, data.msg || message)
      return Promise.reject(error)
    } else {
      let { message } = error
      // 处理不同类型的网络错误
      if (message === 'Network Error') {
        message = '后端接口连接异常'
      }
      if (message.includes('timeout')) {
        message = '后端接口请求超时'
      }
      if (message.includes('Request failed with status code')) {
        const code = message.substr(message.length - 3)
        message = `后端接口${code}异常`
      }
      // 提示用户网络或后端接口未知异常
      Vue.prototype.$baseMessage(message || `后端接口未知异常`, 'error')
      return Promise.reject(error)
    }
  }
)

export default instance
